"""
序列化器作用：
１．序列化：将数据对象转换成ｊｓｏｎ数据类型
２．反序列化：将ｊｓｏｎ数据类型转换成数据对象（校验入库）
定义序列化器
１．定义类，继承自Serializer
２．和模型类，字段，类型，选项一样
    read_only=True　只读
    label　字段说明

定义反序列化器：
    校验：
        １．字段类型，校验
        ２．字段选项，校验
        ３．单字段，校验（方法）
        ４．多字段，校验（方法）
        ５．自定义，校验（方法）
"""''

from rest_framework import serializers

#1.定义序列化器
from book.models import BookInfo
class BookInfoSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='id',read_only=True)
    btitle = serializers.CharField(max_length=20, label='名称')
    bpub_date = serializers.DateField(label='发布日期')
    bread = serializers.IntegerField(default=0, label='阅读量')
    bcomment = serializers.IntegerField(default=0, label='评论数')
    is_delete = serializers.BooleanField(default=False, label='逻辑删除')

    #1.用书籍查作者：关联英雄主键，many=True,一方中，序列化多方需要加上　(获取ｉｄ)
    # heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True)
    #２．关联英雄,__str__返回值（获取ｎａｍｅ）
    # heroinfo_set = serializers.StringRelatedField(read_only=True,many=True)

    # 反序列化单个字段校验 validate多字段校验，加上字段名是单个字段校验
    # def validate_btitle(self, value):
    #
    #      # 校验ｖａｌｕｅ的内容
    #      if '金瓶' not in value:
    #          raise  serializers.ValidationError('书籍不包含金瓶')
    #      return value
    #多字段校验
    def validate(self, attrs):
        """
        :param attrs: 外界传过来的，book_dict
        :return:
        """
        #1．获取阅读量，评论量
        bread = attrs['bread']
        bcomment = attrs['bcomment']
        #2.判断
        if bcomment > bread:
            raise serializers.ValidationError('评论量大于阅读量')
        #返回：
        return attrs

    #实现create方法
    def create(self, validated_data):
        '''
        :param validated_data: 校验成功子后的数据
        :return:
        '''
        #1.创建ｂｏｏｋ对象，入库
        book = BookInfo.objects.create(**validated_data)
        #2.返回
        return book
    #实现update方法：
    def update(self, instance, validated_data):
        '''

        :param instance: 外界传过来的值
        :param validated_data:　验成功子后的数据
        :return:
        '''

        # １.更新数据
        instance.btitle = validated_data['btitle']
        instance.bpub_date = validated_data['bpub_date']
        instance.bread = validated_data['bread']
        instance.bcomment = validated_data['bcomment']

        # 2.入库
        instance.save()

        return instance
 #2英雄数据序列化器
class HeroInfoSerializer(serializers.Serializer):
    """英雄数据序列化器"""
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    id = serializers.IntegerField(label='ID', read_only=True)
    hname = serializers.CharField(label='名字', max_length=20)
    hgender = serializers.ChoiceField(choices=GENDER_CHOICES, label='性别', required=False)
    hcomment = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)

    #1,添加外键,主键表示 必须提供`queryset` 选项, 或者设置 read_only=`True`.显示外键
    # hbook = serializers.PrimaryKeyRelatedField(queryset=BookInfo.objects.all())
    # hbook = serializers.PrimaryKeyRelatedField(read_only=True)
    # 结果：{'id': 1, 'hname': '吴承恩', 'hgender': 1, 'hcomment': '孙悟空', 'hbook': 1}

    #2,添加外键, 来自于关联模型类, __str__的返回值　外键名称
    # hbook = serializers.StringRelatedField(read_only=True)
    # 结果：{'id': 1, 'hname': '吴承恩', 'hgender': 1, 'hcomment': '孙悟空', 'hbook': '西游记'}

    #3,添加外键,关联另外一个序列化器　返回外键关联的所有信息
    hbook = BookInfoSerializer(read_only=True)
    # 结果：{'id': 1, 'hname': '吴承恩', 'hgender': 1, 'hcomment': '孙悟空', 'hbook': OrderedDict([('id', 1), ('btitle', '西游记'), ('bpub_date', '2021-04-21'), ('bread', 30), ('bcomment', 39), ('is_delete', False)])}




'''
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝使用模型类序列化器＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
'''

class BookModelSerializer(serializers.ModelSerializer):

    # mobile = serializers.CharField(max_length=11,min_length=11,label='手机号',write_only=True)

    class Meta:
        model = BookInfo  # 参考模型类生成字段
        fields = '__all__'  #生成所有字段
